﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "box.h"
#include "common.h"
#include "core.h"
#include "log.h"

namespace xos_container
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static xos_box::i_box_mgr * box_mgr_ptr = 0;
    static xos::i_dynamic * xos_module = 0;

    static xos_box::i_serial * serial_ptr = 0;
    static xos_box::i_heart * heart_ptr = 0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    box::box()
    {}

    box::~box()
    {
        term();
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    xos_box::i_big_buf * box::big_buf()
    {
        xos_box::i_big_buf * pRet = 0;
        get()->create( xos_box::enumObj::BOX_OBJ_BIG_BUF, ( void ** )&pRet );
        return pRet;
    }

    xos_box::i_buf * box::buf()
    {
        xos_box::i_buf * pRet = 0;
        get()->create( xos_box::enumObj::BOX_OBJ_BUF, ( void ** )&pRet );
        return pRet;
    }

    xos_box::i_msg * box::msg()
    {
        xos_box::i_msg * pRet = 0;
        get()->create( xos_box::enumObj::BOX_OBJ_MSG, ( void ** )&pRet );
        return pRet;
    }

    xos_box::i_list * box::list()
    {
        xos_box::i_list * pRet = 0;
        get()->create( xos_box::enumObj::BOX_OBJ_LIST, ( void ** )&pRet );
        return pRet;
    }

    xos_box::i_property * box::prop()
    {
        xos_box::i_property * pRet = 0;
        get()->create( xos_box::enumObj::BOX_OBJ_PROPERTY, ( void ** )&pRet);
        return pRet;
    }

    xos_box::i_variant * box::vt()
    {
        xos_box::i_variant * pRet = 0;
        get()->create( xos_box::enumObj::BOX_OBJ_VARIANT, ( void ** )&pRet );
        return pRet;
    }

    xos_box::i_box_mgr * box::get()
    {
        return box_mgr_ptr;
    }

    xos_box::i_serial * box::serial()
    {
        return serial_ptr;
    }

    xos_box::i_heart * box::heart()
    {
        return heart_ptr;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int box::init()
    {
        int ret = 0;

        xos_box::f_create fun = 0;

        if( 0 == ret )
        {
            ret = core::get()->create( xos::i_xos::XOS_OBJ_DYNAMIC, ( void ** )&xos_module );
        }

        if( 0 == ret )
        {
            ret = xos_module->load_and_get( ( void ** )&fun,
                core::exe_path(),
                "xos_box",
                "create" );
        }

        if( 0 == ret )
        {
            ret = fun( core::get(), common::get(), log::get(), &box_mgr_ptr );
        }

        if( 0 == ret )
        {
            ret = get()->create( xos_box::enumObj::BOX_OBJ_SERIAL, ( void ** )&serial_ptr );
        }

        if( 0 == ret )
        {
            ret = get()->create( xos_box::enumObj::BOX_OBJ_HEART, ( void ** )&heart_ptr );
        }

        return ret;
    }

    int box::term()
    {
        int ret = 0;

        xos_stl::release_interface( serial_ptr );
        xos_stl::release_interface( heart_ptr );
        xos_stl::release_interface( box_mgr_ptr );
        xos_stl::release_interface( xos_module );

        return ret;
    }

} // xos_container
